0.1 Ugulama: Elmas

Elmas veri seti üzerinde veri temizleme, veri düzenleme, gerekli görülen fonksiyonların veri seti üzerinde kullanılması, tanımsal istatistikleri elde etme, görselleştirme uygulanmıştır.

Veri Seti kaggle üzerinden linki ile alınmıştır.

library("plotly")
library("tidyr")
library("tidyverse")
library("dplyr")
library("ggplot2")
library("psych")
library(scales)
elmas = ggplot2::diamonds
as_tibble(elmas)

Elmas veri setinin tamamı yukarıda gözükmektedir.

glimpse(elmas)
Rows: 53,940
Columns: 10
$ carat   <dbl> 0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, 0.23, 0.30, 0.23, 0.22, 0.31, 0.20, 0.32, 0.30~
$ cut     <ord> Ideal, Premium, Good, Premium, Good, Very Good, Very Good, Very Good, Fair, Very Good, Good, Ideal, ~
$ color   <ord> E, E, E, I, J, J, I, H, E, H, J, J, F, J, E, E, I, J, J, J, I, E, H, J, J, G, I, J, D, F, F, F, E, E~
$ clarity <ord> SI2, SI1, VS1, VS2, SI2, VVS2, VVS1, SI1, VS2, VS1, SI1, VS1, SI1, SI2, SI2, I1, SI2, SI1, SI1, SI1,~
$ depth   <dbl> 61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, 59.4, 64.0, 62.8, 60.4, 62.2, 60.2, 60.9, 62.0~
$ table   <dbl> 55, 61, 65, 58, 58, 57, 57, 55, 61, 61, 55, 56, 61, 54, 62, 58, 54, 54, 56, 59, 56, 55, 57, 62, 62, ~
$ price   <int> 326, 326, 327, 334, 335, 336, 336, 337, 337, 338, 339, 340, 342, 344, 345, 345, 348, 351, 351, 351, ~
$ x       <dbl> 3.95, 3.89, 4.05, 4.20, 4.34, 3.94, 3.95, 4.07, 3.87, 4.00, 4.25, 3.93, 3.88, 4.35, 3.79, 4.38, 4.31~
$ y       <dbl> 3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, 4.05, 4.28, 3.90, 3.84, 4.37, 3.75, 4.42, 4.34~
$ z       <dbl> 2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, 2.39, 2.73, 2.46, 2.33, 2.71, 2.27, 2.68, 2.68~

Elmas veri setindeki değişkenlerin türleri yukarıdaki gibidir.

describe(elmas$price,trim = 0.05,type=3)

Price(Fiyat) değişkeninin tanımlayıcı istatistikleri yukarıdaki tabloda gösterilmiştir.

Örnek verilecek olusa PRice(Fiyat) değişkeninin;

  • %5 kesilmiş ortalaması = 3470,84

  • Medyanı 2401

  • Çarpıklığı 1,62 ( Price değişkeni sağa çarğık denilebilir.)

Elmas verisini istatistikleri

names(elmas)
 [1] "carat"   "cut"     "color"   "clarity" "depth"   "table"   "price"   "x"       "y"       "z"      

Degisken isimleri

0.2 Dplyr Fonksiyonu ile işlemler

0.2.1 Select

Elmas verisiden clarity, depth, table ve price değişkenlerini getir?

select(elmas,clarity:price)

Elmas verisiden clarity, depth, table ve price degişkenleri dışındaki değişkenleri getir?

select(elmas,-(clarity:price))

0.2.2 Filter

Elmas veri setinde kesimi premium ve Very Good olanları getir?

filter(elmas, cut %in% c("Premium","Very Good"))

Elmas veri setinde table 60’dan az ver price 400’den fazla olanları getir?

filter(elmas,table < 60 & price > 400)

0.2.3 Arrange

Elmas verisetini price değişkenine göre küçükten büyüğe sırala.

arrange(elmas, price)

Elmas veri setinde cut, clarity ve table degiskenlerini table değişkenine göre küçükten büyüğe sırala.

arrange(select(elmas, cut, clarity,table), table)

Elmas veri setinde cut, clarity,price ve table degiskenlerini table değişkenine göre büyüğe küçükten sırala.

arrange(select(elmas,cut, clarity, price, table),desc(table))

0.2.4 Summarise

Elmas verisetinin gözlem sayısı, Cut, clarity ve Color kategori sayilarini ve ortalama table sayisini bulununz

summarise(elmas,GozlemSayisi=n(),
          CutDestinasyonlari=n_distinct(cut),
          ClarityDestinasyonlari= n_distinct(clarity),
          ColorDestinasyonlari= n_distinct(color),
          OrtalamaTable= mean(table, na.rm = T))

0.2.5 Pipe operatoru

Depth ve table değişkenleri icin depth<table kosulu altinda toplam table’lı bulun

elmas %>% 
  select(depth,table) %>% 
  filter(depth< table) %>% 
  summarise(genel_toplam = sum(table))

Ortalama carat miktarını bulunuz?

elmas %>% select(carat) %>% sum()
[1] 43040.87

Rengi J olan depthleri bulunuz?

head(elmas %>% select(color, depth) %>% filter(color=="J"))

Cut değişkenini kategorilere gore dagilimi

elmas %>% group_by(cut) %>% summarise(Adet=n())

Color degiskeninin kategorilere gore dagilimi

elmas %>% group_by(color) %>% summarise(Adet=n())

Cut degiskeninin kategorilere gore dagilimi

elmas %>% group_by(clarity) %>% summarise(Adet=n())

Cut ve Clarity degiskenlerini ikili dagilimi

elmas %>% group_by(cut, clarity) %>% summarise(Adet=n())
`summarise()` has grouped output by 'cut'. You can override using the `.groups` argument.

0.3 Grafikler

0.3.1 Point plot

ggplot(data=elmas)+ geom_point(mapping = aes(x=price,y=table,color=clarity))

0.3.2 Box Plot

ggplot(data=elmas)+geom_boxplot(mapping = aes(x=clarity, y=table, color=clarity))

ggplot(data=elmas)+geom_boxplot(mapping = aes(x=cut, y=table, color=cut))

ggplot(data=elmas)+geom_boxplot(mapping = aes(x=color, y=table, color=color))

0.3.3 Histogram


ggplot(diamonds,aes(x = cut, fill = cut)) + 
  geom_bar(aes(y = (..count..)))+ geom_text(aes(y=(..count..), vjust = -0.5, label = ifelse((..count..)== 0 ,"", scales::percent((..count..)/sum(..count..)))), stat = "count")+
  labs( x = "Elmasların kesim türü",
        y = "Frekanslar",
        title = "Kesimlerine göre elmas türleri")

NA
ggplot(data=elmas,aes(x=price))+geom_histogram(aes(y=..density..),color="Black", fill="Blue")+geom_density()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data=elmas,aes(x=depth))+geom_histogram(aes(y=..density..),color="Black", fill="Red")+geom_density()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data=elmas,aes(x=carat))+geom_histogram(aes(y=..density..),color="Black", fill="Purple")+geom_density()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity), position = "dodge")

ggplot(data=elmas)+ geom_bar(mapping = aes(x=cut, fill=clarity))

ggplot(data=elmas)+ geom_bar(mapping = aes(x=cut, fill=clarity),position = "fill")

0.3.4 Pasta Grafiği


ggplot(diamonds,aes(x = "", fill=clarity)) + 
  geom_bar(width = 1) + 
  coord_polar (theta="y")


ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = cut), show.legend = FALSE, width = 1) + 
  theme(aspect.ratio = 1) +
  labs(x = NULL, y = NULL)+ 
  coord_flip()+ 
  coord_polar()
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

0.3.5 3D Plot


plot_ly(diamonds, x = ~carat, y = ~depth, z = ~table, color = ~color, colors = c('#BF382A', '#0C4B8E')) %>%
  add_markers() %>%
  layout(scene = list(xaxis = list(title = 'carat'),
                     yaxis = list(title = 'depth'),
                     zaxis = list(title = 'table')))
NA
NA
LS0tDQp0aXRsZTogIkVsbWFzIFZlcmlzaSDDnHplcmluZGUgVGFuxLFtbGF5xLFjxLEgxLBzdGF0aXN0aWtsZXIgdmUgR8O2cnNlbGxlxZ90aXJtZSINCmF1dGhvcjogIkdpdGh1YjogT3pndXJucnR0biINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsbWVzc2FnZSA9RikNCmBgYA0KDQojIyBVZ3VsYW1hOiBFbG1hcw0KDQpFbG1hcyB2ZXJpIHNldGkgw7x6ZXJpbmRlIHZlcmkgdGVtaXpsZW1lLCB2ZXJpIGTDvHplbmxlbWUsIGdlcmVrbGkgZ8O2csO8bGVuIGZvbmtzaXlvbmxhcsSxbiB2ZXJpIHNldGkgw7x6ZXJpbmRlIGt1bGxhbsSxbG1hc8SxLCB0YW7EsW1zYWwgaXN0YXRpc3Rpa2xlcmkgZWxkZSBldG1lLCBnw7Zyc2VsbGXFn3Rpcm1lIHV5Z3VsYW5txLHFn3TEsXIuDQoNClZlcmkgU2V0aSBrYWdnbGUgw7x6ZXJpbmRlbiBbbGlua2ldKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vc2hpdmFtMjUwMy9kaWFtb25kcykgaWxlIGFsxLFubcSxxZ90xLFyLg0KDQpgYGB7ciwgd2FybmluZz1GICwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoInBsb3RseSIpDQpsaWJyYXJ5KCJ0aWR5ciIpDQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSgiZHBseXIiKQ0KbGlicmFyeSgiZ2dwbG90MiIpDQpsaWJyYXJ5KCJwc3ljaCIpDQpsaWJyYXJ5KHNjYWxlcykNCmVsbWFzID0gZ2dwbG90Mjo6ZGlhbW9uZHMNCmBgYA0KDQpgYGB7cn0NCmFzX3RpYmJsZShlbG1hcykNCmBgYA0KDQpFbG1hcyB2ZXJpIHNldGluaW4gdGFtYW3EsSB5dWthcsSxZGEgZ8O2esO8a21la3RlZGlyLg0KDQpgYGB7cn0NCmdsaW1wc2UoZWxtYXMpDQpgYGANCg0KRWxtYXMgdmVyaSBzZXRpbmRla2kgZGXEn2nFn2tlbmxlcmluIHTDvHJsZXJpIHl1a2FyxLFkYWtpIGdpYmlkaXIuDQoNCmBgYHtyfQ0KZGVzY3JpYmUoZWxtYXMkcHJpY2UsdHJpbSA9IDAuMDUsdHlwZT0zKQ0KYGBgDQpQcmljZShGaXlhdCkgZGXEn2nFn2tlbmluaW4gdGFuxLFtbGF5xLFjxLEgaXN0YXRpc3Rpa2xlcmkgeXVrYXLEsWRha2kgdGFibG9kYSBnw7ZzdGVyaWxtacWfdGlyLiANCg0Kw5ZybmVrIHZlcmlsZWNlayBvbHVzYSBQUmljZShGaXlhdCkgZGXEn2nFn2tlbmluaW47DQoNCiogJTUga2VzaWxtacWfIG9ydGFsYW1hc8SxID0gMzQ3MCw4NA0KDQoqIE1lZHlhbsSxIDI0MDENCg0KKiDDh2FycMSxa2zEscSfxLEgMSw2MiAoIFByaWNlIGRlxJ9pxZ9rZW5pIHNhxJ9hIMOnYXLEn8SxayBkZW5pbGViaWxpci4pDQoNCg0KRWxtYXMgdmVyaXNpbmkgaXN0YXRpc3Rpa2xlcmkNCg0KYGBge3J9DQpuYW1lcyhlbG1hcykNCmBgYA0KDQpEZWdpc2tlbiBpc2ltbGVyaQ0KDQojIyBEcGx5ciBGb25rc2l5b251IGlsZSBpxZ9sZW1sZXINCg0KIyMjIFNlbGVjdA0KDQpFbG1hcyB2ZXJpc2lkZW4gY2xhcml0eSwgZGVwdGgsIHRhYmxlIHZlIHByaWNlIGRlxJ9pxZ9rZW5sZXJpbmkgZ2V0aXI/DQoNCmBgYHtyIH0NCnNlbGVjdChlbG1hcyxjbGFyaXR5OnByaWNlKQ0KYGBgDQoNCkVsbWFzIHZlcmlzaWRlbiBjbGFyaXR5LCBkZXB0aCwgdGFibGUgdmUgcHJpY2UgZGVnacWfa2VubGVyaSBkxLHFn8SxbmRha2kgZGXEn2nFn2tlbmxlcmkgZ2V0aXI/DQoNCmBgYHtyfQ0Kc2VsZWN0KGVsbWFzLC0oY2xhcml0eTpwcmljZSkpDQpgYGANCg0KIyMjIEZpbHRlcg0KDQpFbG1hcyB2ZXJpIHNldGluZGUga2VzaW1pIHByZW1pdW0gdmUgVmVyeSBHb29kIG9sYW5sYXLEsSBnZXRpcj8NCg0KYGBge3J9DQpmaWx0ZXIoZWxtYXMsIGN1dCAlaW4lIGMoIlByZW1pdW0iLCJWZXJ5IEdvb2QiKSkNCmBgYA0KDQpFbG1hcyB2ZXJpIHNldGluZGUgdGFibGUgNjAnZGFuIGF6IHZlciBwcmljZSA0MDAnZGVuIGZhemxhIG9sYW5sYXLEsSBnZXRpcj8NCg0KYGBge3J9DQpmaWx0ZXIoZWxtYXMsdGFibGUgPCA2MCAmIHByaWNlID4gNDAwKQ0KYGBgDQoNCiMjIyBBcnJhbmdlDQoNCkVsbWFzIHZlcmlzZXRpbmkgcHJpY2UgZGXEn2nFn2tlbmluZSBnw7ZyZSBrw7zDp8O8a3RlbiBiw7x5w7zEn2Ugc8SxcmFsYS4NCg0KYGBge3J9DQphcnJhbmdlKGVsbWFzLCBwcmljZSkNCmBgYA0KDQpFbG1hcyB2ZXJpIHNldGluZGUgY3V0LCBjbGFyaXR5IHZlIHRhYmxlIGRlZ2lza2VubGVyaW5pIHRhYmxlIGRlxJ9pxZ9rZW5pbmUgZ8O2cmUga8O8w6fDvGt0ZW4gYsO8ecO8xJ9lIHPEsXJhbGEuDQoNCmBgYHtyfQ0KYXJyYW5nZShzZWxlY3QoZWxtYXMsIGN1dCwgY2xhcml0eSx0YWJsZSksIHRhYmxlKQ0KYGBgDQoNCkVsbWFzIHZlcmkgc2V0aW5kZSBjdXQsIGNsYXJpdHkscHJpY2UgdmUgdGFibGUgZGVnaXNrZW5sZXJpbmkgdGFibGUgZGXEn2nFn2tlbmluZSBnw7ZyZSBiw7x5w7zEn2Uga8O8w6fDvGt0ZW4gc8SxcmFsYS4NCg0KYGBge3J9DQphcnJhbmdlKHNlbGVjdChlbG1hcyxjdXQsIGNsYXJpdHksIHByaWNlLCB0YWJsZSksZGVzYyh0YWJsZSkpDQpgYGANCg0KIyMjIFN1bW1hcmlzZQ0KDQpFbG1hcyB2ZXJpc2V0aW5pbiBnw7Z6bGVtIHNhecSxc8SxLCBDdXQsIGNsYXJpdHkgdmUgQ29sb3Iga2F0ZWdvcmkgc2F5aWxhcmluaSB2ZSBvcnRhbGFtYSB0YWJsZSBzYXlpc2luaSBidWx1bnVueg0KDQpgYGB7cn0NCnN1bW1hcmlzZShlbG1hcyxHb3psZW1TYXlpc2k9bigpLA0KICAgICAgICAgIEN1dERlc3RpbmFzeW9ubGFyaT1uX2Rpc3RpbmN0KGN1dCksDQogICAgICAgICAgQ2xhcml0eURlc3RpbmFzeW9ubGFyaT0gbl9kaXN0aW5jdChjbGFyaXR5KSwNCiAgICAgICAgICBDb2xvckRlc3RpbmFzeW9ubGFyaT0gbl9kaXN0aW5jdChjb2xvciksDQogICAgICAgICAgT3J0YWxhbWFUYWJsZT0gbWVhbih0YWJsZSwgbmEucm0gPSBUKSkNCmBgYA0KDQojIyMgUGlwZSBvcGVyYXRvcnUNCg0KRGVwdGggdmUgdGFibGUgZGXEn2nFn2tlbmxlcmkgaWNpbiBkZXB0aFw8dGFibGUga29zdWx1IGFsdGluZGEgdG9wbGFtIHRhYmxlJ2zEsSBidWx1bg0KDQpgYGB7cn0NCmVsbWFzICU+JSANCiAgc2VsZWN0KGRlcHRoLHRhYmxlKSAlPiUgDQogIGZpbHRlcihkZXB0aDwgdGFibGUpICU+JSANCiAgc3VtbWFyaXNlKGdlbmVsX3RvcGxhbSA9IHN1bSh0YWJsZSkpDQpgYGANCg0KT3J0YWxhbWEgY2FyYXQgbWlrdGFyxLFuxLEgYnVsdW51ej8NCg0KYGBge3J9DQplbG1hcyAlPiUgc2VsZWN0KGNhcmF0KSAlPiUgc3VtKCkNCmBgYA0KDQpSZW5naSBKIG9sYW4gZGVwdGhsZXJpIGJ1bHVudXo/DQoNCmBgYHtyfQ0KaGVhZChlbG1hcyAlPiUgc2VsZWN0KGNvbG9yLCBkZXB0aCkgJT4lIGZpbHRlcihjb2xvcj09IkoiKSkNCmBgYA0KDQpDdXQgZGXEn2nFn2tlbmluaSBrYXRlZ29yaWxlcmUgZ29yZSBkYWdpbGltaQ0KDQpgYGB7cn0NCmVsbWFzICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UoQWRldD1uKCkpDQpgYGANCg0KQ29sb3IgZGVnaXNrZW5pbmluIGthdGVnb3JpbGVyZSBnb3JlIGRhZ2lsaW1pDQoNCmBgYHtyfQ0KZWxtYXMgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKEFkZXQ9bigpKQ0KYGBgDQoNCkN1dCBkZWdpc2tlbmluaW4ga2F0ZWdvcmlsZXJlIGdvcmUgZGFnaWxpbWkNCg0KYGBge3J9DQplbG1hcyAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShBZGV0PW4oKSkNCmBgYA0KDQpDdXQgdmUgQ2xhcml0eSBkZWdpc2tlbmxlcmluaSBpa2lsaSBkYWdpbGltaQ0KDQpgYGB7cn0NCmVsbWFzICU+JSBncm91cF9ieShjdXQsIGNsYXJpdHkpICU+JSBzdW1tYXJpc2UoQWRldD1uKCkpDQpgYGANCg0KIyMgR3JhZmlrbGVyDQoNCiMjIyBQb2ludCBwbG90DQoNCmBgYHtyLCBlY2hvPVR9DQpnZ3Bsb3QoZGF0YT1lbG1hcykrIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4PXByaWNlLHk9dGFibGUsY29sb3I9Y2xhcml0eSkpDQpgYGANCg0KIyMjIEJveCBQbG90DQoNCmBgYHtyLCBlY2hvPVR9DQpnZ3Bsb3QoZGF0YT1lbG1hcykrZ2VvbV9ib3hwbG90KG1hcHBpbmcgPSBhZXMoeD1jbGFyaXR5LCB5PXRhYmxlLCBjb2xvcj1jbGFyaXR5KSkNCmBgYA0KDQpgYGB7ciwgZWNobz1UfQ0KZ2dwbG90KGRhdGE9ZWxtYXMpK2dlb21fYm94cGxvdChtYXBwaW5nID0gYWVzKHg9Y3V0LCB5PXRhYmxlLCBjb2xvcj1jdXQpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPVR9DQpnZ3Bsb3QoZGF0YT1lbG1hcykrZ2VvbV9ib3hwbG90KG1hcHBpbmcgPSBhZXMoeD1jb2xvciwgeT10YWJsZSwgY29sb3I9Y29sb3IpKQ0KYGBgDQoNCiMjIyBIaXN0b2dyYW0NCg0KYGBge3IsIGVjaG89VH0NCg0KZ2dwbG90KGRpYW1vbmRzLGFlcyh4ID0gY3V0LCBmaWxsID0gY3V0KSkgKyANCiAgZ2VvbV9iYXIoYWVzKHkgPSAoLi5jb3VudC4uKSkpKyBnZW9tX3RleHQoYWVzKHk9KC4uY291bnQuLiksIHZqdXN0ID0gLTAuNSwgbGFiZWwgPSBpZmVsc2UoKC4uY291bnQuLik9PSAwICwiIiwgc2NhbGVzOjpwZXJjZW50KCguLmNvdW50Li4pL3N1bSguLmNvdW50Li4pKSkpLCBzdGF0ID0gImNvdW50IikrDQogIGxhYnMoIHggPSAiRWxtYXNsYXLEsW4ga2VzaW0gdMO8csO8IiwNCiAgICAgICAgeSA9ICJGcmVrYW5zbGFyIiwNCiAgICAgICAgdGl0bGUgPSAiS2VzaW1sZXJpbmUgZ8O2cmUgZWxtYXMgdMO8cmxlcmkiKQ0KIA0KYGBgDQoNCmBgYHtyLCBlY2hvPVR9DQpnZ3Bsb3QoZGF0YT1lbG1hcyxhZXMoeD1wcmljZSkpK2dlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSxjb2xvcj0iQmxhY2siLCBmaWxsPSJCbHVlIikrZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQpgYGB7ciwgZWNobz1UfQ0KZ2dwbG90KGRhdGE9ZWxtYXMsYWVzKHg9ZGVwdGgpKStnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sb3I9IkJsYWNrIiwgZmlsbD0iUmVkIikrZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQpgYGB7ciwgZWNobz1UfQ0KZ2dwbG90KGRhdGE9ZWxtYXMsYWVzKHg9Y2FyYXQpKStnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sb3I9IkJsYWNrIiwgZmlsbD0iUHVycGxlIikrZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQpgYGB7ciwgZWNobz1UfQ0KDQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzKSArIA0KICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQsIGZpbGwgPSBjbGFyaXR5KSwgcG9zaXRpb24gPSAiZG9kZ2UiKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPVR9DQpnZ3Bsb3QoZGF0YT1lbG1hcykrIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeD1jdXQsIGZpbGw9Y2xhcml0eSkpDQpgYGANCg0KYGBge3IsIGVjaG89VH0NCmdncGxvdChkYXRhPWVsbWFzKSsgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4PWN1dCwgZmlsbD1jbGFyaXR5KSxwb3NpdGlvbiA9ICJmaWxsIikNCmBgYA0KDQojIyMgUGFzdGEgR3JhZmnEn2kNCmBgYHtyLCBlY2hvPVR9DQoNCmdncGxvdChkaWFtb25kcyxhZXMoeCA9ICIiLCBmaWxsPWNsYXJpdHkpKSArIA0KICBnZW9tX2Jhcih3aWR0aCA9IDEpICsgDQogIGNvb3JkX3BvbGFyICh0aGV0YT0ieSIpDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1UfQ0KDQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzKSArIA0KICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQsIGZpbGwgPSBjdXQpLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCB3aWR0aCA9IDEpICsgDQogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEpICsNCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpKyANCiAgY29vcmRfZmxpcCgpKyANCiAgY29vcmRfcG9sYXIoKQ0KDQpgYGANCg0KIyMjIDNEIFBsb3QNCg0KYGBge3J9DQoNCnBsb3RfbHkoZGlhbW9uZHMsIHggPSB+Y2FyYXQsIHkgPSB+ZGVwdGgsIHogPSB+dGFibGUsIGNvbG9yID0gfmNvbG9yLCBjb2xvcnMgPSBjKCcjQkYzODJBJywgJyMwQzRCOEUnKSkgJT4lDQogIGFkZF9tYXJrZXJzKCkgJT4lDQogIGxheW91dChzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ2NhcmF0JyksDQogICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnZGVwdGgnKSwNCiAgICAgICAgICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICd0YWJsZScpKSkNCg0KDQpgYGANCg==